package cn.sixmillions.yuqueblog.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

import java.net.Authenticator;
import java.net.PasswordAuthentication;
import java.util.Properties;

/**
 * 参考：
 * https://www.cnblogs.com/ld1022/p/3735772.html
 *
 * @author lbw
 */
@Component
@Slf4j
// 判断是否需要加载代理
@ConditionalOnProperty(value = "proxy.enable", havingValue = "true")
public class MyProxy {

    @Value("${proxy.host}")
    private String host;

    @Value("${proxy.port}")
    private String port;

    @Value("${proxy.user}")
    private String user;

    @Value("${proxy.password}")
    private String password;

    @Bean
    public void commonLocalGlobalProxy() {
        log.info("设置全局代理");
        Properties prop = System.getProperties();
        // 设置http访问要使用的代理服务器的地址
        prop.setProperty("http.proxyHost", host);
        // 设置http访问要使用的代理服务器的端口
        prop.setProperty("http.proxyPort", port);
        // 设置不需要通过代理服务器访问的主机，可以使用*通配符，多个地址用|分隔
        prop.setProperty("http.nonProxyHosts", "localhost|192.168.0.*|127.0.0.1");
        // 设置安全访问使用的代理服务器地址与端口
        // 它没有https.nonProxyHosts属性，它按照http.nonProxyHosts 中设置的规则访问
        prop.setProperty("https.proxyHost", host);
        prop.setProperty("https.proxyPort", port);
        // 使用ftp代理服务器的主机、端口以及不需要使用ftp代理服务器的主机
        //prop.setProperty("ftp.proxyHost", "183.45.78.31");
        //prop.setProperty("ftp.proxyPort", "21");
        //prop.setProperty("ftp.nonProxyHosts", "localhost|192.168.0.*");
        // socks代理服务器的地址与端口
        prop.setProperty("socksProxyHost", host);
        prop.setProperty("socksProxyPort", port);
        // 设置登陆到代理服务器的用户名和密码
        Authenticator.setDefault(new MyAuthenticator(user, password));
    }

    /**
     * 认证
     */
    static class MyAuthenticator extends Authenticator {
        private String user = "";
        private String password = "";

        public MyAuthenticator(String user, String password) {
            this.user = user;
            this.password = password;
        }

        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(user, password.toCharArray());
        }
    }
}
